<!doctype html>
<html lang="zh-cn">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.57.2" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Ch03 Lambda表达式 | The Sky of OtsWang</title>
    <meta property="og:title" content="Ch03 Lambda表达式 - The Sky of OtsWang">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2019-04-25T17:31:31&#43;08:00">
        
        
    <meta property="article:modified_time" content="2019-04-25T17:31:31&#43;08:00">
        
    <meta name="Keywords" content="golang,go语言,otswang,java,博客,python">
    <meta name="description" content="Ch03 Lambda表达式">
        
    <meta name="author" content="OtsWang">
    <meta property="og:url" content="https://otswang.gitee.io/hugo/post/java/java_8_inaction/ch03/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/hugo/css/normalize.css">
    
        <link rel="stylesheet" href="/hugo/css/prism.css">
    
    <link rel="stylesheet" href="/hugo/css/style.css">
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    


    
    
</head>

<body>
<header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="https://otswang.gitee.io/hugo/">
                        The Sky of OtsWang
                    </a>
                
                <p class="description">擅长写HelloWorld的小小码农</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    
                    
                    <a  href="https://otswang.gitee.io/hugo/" title="Home">Home</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/tags/" title="Tags">Tags</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/categories/" title="Categories">Categories</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/archives/" title="Archives">Archives</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/about/" title="About">About</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">Ch03 Lambda表达式</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2019年4月25日
                        </date>
                        
                        <div class="post-meta">
                            <span>|</span>
                            
                                <span class="meta-category"><a href="https://otswang.gitee.io/hugo/categories/java-java8inaction">Java-Java8InAction</a></span>
                            
                        </div>
                        
                        
                        
                        <div class="post-content">
                            <p>主要内容： 在哪y以及如何使用lambda表达式，环绕执行模式，函数式接口，类型推断以及方法引用和lambda复合。</p>

<p>lambda表达式：简洁的表示可传递的匿名函数的一种方式，没有名称，但有参数列表，函数主体和返回类型，可能还有一个可以抛出的异常列表。</p>

<h1 id="基本语法">基本语法</h1>

<pre><code>(paramters) -&gt; expression

or

(paramters) -&gt; {statements;}

</code></pre>

<p>一些示例：注意，有<code>{}</code> 时，只有有语句，就需要<code>;</code>。</p>

<pre><code class="language-java">
// bool
(List&lt;String&gt; list) -&gt; list.isEmpty()

// create object
() -&gt; new Apple(10)

// consumer
(Apple a) -&gt; {
    System.out.println(a.getWeight());
}

// 从对象中抽取
(String s) -&gt; s.length()

// 组合两个值
(int a, int b) -&gt; a * b

// 比较两个值
(Apple a1, Apple a2) -&gt; a1.getWeight().compareTo(a2.getWeight())

</code></pre>

<h1 id="使用场景">使用场景</h1>

<p><strong>函数式接口</strong></p>

<p>只定义了<strong>一个</strong>抽象方法（<strong>函数描述符</strong>）的接口（可以有多个默认方法）（<code>@FunctionalInterface</code>）。注意，此处的抽象方法是排除继承自Object类的。</p>

<p>为啥？因为<code>equals</code>方法是来自于Object类的。</p>

<pre><code class="language-java">public interface Comparator&lt;T&gt; {
    int compare(T o1, T o2); 
    boolean equals(Object obj);
    // ...
}
</code></pre>

<p>lambda表达式允许以内联的形式为函数式接口的抽象方法提供实现，并把整个表达式作为函数式接口的一个实例。</p>

<p>关于函数描述符:  Scala等语言的类型系统提供显式类型标注，可以描述函数的类型（称为“函数类型”）。Java重用了函数式接口提
供的标准类型，并将其映射成一种形式的函数类型。</p>

<p><strong>环绕执行模式</strong></p>

<p>资源处理(例如处理文件或数据库)时的常见模式为打开一个资源，做一些处理，然后关闭资源。这个模式中，主要的变化是对资源的处理阶段，此时可以有lambda传递一个行为，即行为参数化。</p>

<p>一个例子：</p>

<pre><code class="language-java">public static String processFile () throws IOException {
    try ( BufferReader br = new BufferedReader( new FileReader(&quot;data.txt&quot;) ) ){
        return br.readLine();
    }
}
</code></pre>

<p>在这个例子中，主要的环绕操作是对数据的处理：<code>br.readLine()</code>. 可以把这个行为作为一个参数传递，可以定义一个输入参数为 <code>BufferedReader</code>返回值为<code>String</code>的函数接口。</p>

<pre><code class="language-java">@FunctionalInterface
public interface Do {
    public String doIt(BufferedReader bf);
}
</code></pre>

<pre><code class="language-java">public static String processFile(Do do) throws IOException {
    try ( BufferReader bf = new BufferedReader( new FileReader(&quot;data.txt&quot;) ) ){
        return do.doIt(bf);
    }
}
</code></pre>

<h1 id="函数式接口的使用">函数式接口的使用</h1>

<p>函数式接口的抽象方法的签名称为函数描述符。</p>

<p>java.util.function 包下：</p>

<pre><code>├── BiConsumer.java
├── BiFunction.java
├── BinaryOperator.java
├── BiPredicate.java
├── BooleanSupplier.java
├── Consumer.java
├── DoubleBinaryOperator.java
├── DoubleConsumer.java
├── DoubleFunction.java
├── DoublePredicate.java
├── DoubleSupplier.java
├── DoubleToIntFunction.java
├── DoubleToLongFunction.java
├── DoubleUnaryOperator.java
├── Function.java
├── IntBinaryOperator.java
├── IntConsumer.java
├── IntFunction.java
├── IntPredicate.java
├── IntSupplier.java
├── IntToDoubleFunction.java
├── IntToLongFunction.java
├── IntUnaryOperator.java
├── LongBinaryOperator.java
├── LongConsumer.java
├── LongFunction.java
├── LongPredicate.java
├── LongSupplier.java
├── LongToDoubleFunction.java
├── LongToIntFunction.java
├── LongUnaryOperator.java
├── ObjDoubleConsumer.java
├── ObjIntConsumer.java
├── ObjLongConsumer.java
├── package-info.java
├── Predicate.java
├── Supplier.java
├── ToDoubleBiFunction.java
├── ToDoubleFunction.java
├── ToIntBiFunction.java
├── ToIntFunction.java
├── ToLongBiFunction.java
├── ToLongFunction.java
└── UnaryOperator.java
</code></pre>

<p><strong>Predicate</strong>  test: T -&gt; boolean</p>

<p><strong>Consumer</strong> accept T -&gt; void</p>

<p><strong>Function</strong> apply T -&gt; R</p>

<p>一些常用的例子：</p>

<table>
<thead>
<tr>
<th>使用案例</th>
<th>lambda 例子</th>
<th>对应的函数式接口</th>
</tr>
</thead>

<tbody>
<tr>
<td>布尔表达式</td>
<td><code>(List&lt;String&gt; list) -&gt; list.isEmpty()</code></td>
<td><code>Predicate&lt;List&lt;String&gt;&gt;</code></td>
</tr>

<tr>
<td>创建对象</td>
<td><code>() -&gt; new Apple(10)</code></td>
<td><code>Supplier&lt;Apple&gt;</code></td>
</tr>

<tr>
<td>消费对象</td>
<td><code>(Apple a) -&gt; Sout(a.getWeight())</code></td>
<td><code>Consumer&lt;Apple&gt;</code></td>
</tr>

<tr>
<td>从一个对象中选择提取</td>
<td><code>(String s) -&gt; s.length()</code></td>
<td><code>Function&lt;String, Integer&gt; or ToIntFunction&lt;String&gt;</code></td>
</tr>

<tr>
<td>合并两个值</td>
<td><code>(int a, int b) -&gt; a*b</code></td>
<td><code>IntBinaryOperator</code></td>
</tr>

<tr>
<td>比较</td>
<td>&hellip;</td>
<td>&hellip;</td>
</tr>
</tbody>
</table>

<h1 id="高级应用-类型检查-类型推断以及限制">高级应用-类型检查、类型推断以及限制</h1>

<p>lambda 可以使用实例变量和静态变量。因为这两者是保存在堆上的。而局部变量是保存在栈上的。</p>

<p>局部变量： lambda表达式可以使用局部变量，但是此变量应该是final修饰或者实际为final修饰，如下的代码是不会编译通过的。</p>

<pre><code class="language-java">int num = 1;
Runnable r = () -&gt; Sout(num);
num ++;
</code></pre>

<h1 id="闭包">闭包</h1>

<p>你可能已经听说过闭包（closure，不要和Clojure编程语言混淆）这个词，你可能会想Lambda是否满足闭包的定义。用科学的说法来说，闭包就是一个函数的实例，且它可以无限制地访问那个函数的非本地变量。例如，闭包可以作为参数传递给另一个函数。它也可以访问和修改其作用域之外的变量。现在，Java 8的Lambda和匿名类可以做类似于闭包的事情：它们可以作为参数传递给方法，并且可以访问其作用域之外的变量。但有一个限制：它们不能修改定义Lambda的方法的局部变量的内容。这些变量必须是隐式最终的。可以认为Lambda是对值封闭，而不是对变量封闭。如前所述，这种限制存在的原因在于局部变量保存在栈上，并且隐式表示它们仅限于其所在线程。如果允许捕获可改变的局部变量，就会引发造成线程不安全的新的可能性，而这是我们不想看到的（实例变量可以，因为它们保存在堆中，而堆是在线程之间共享的）。</p>

<h1 id="方法引用与构造函数引用">方法引用与构造函数引用</h1>

<p>方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。它的基本思想是，如果一个Lambda代表的只是“直接调用这个方法”，那最好还是用名称来调用它，而不是去描述如何调用它。</p>

<p>你可以把方法引用看作针对仅仅涉及单一方法的Lambda的语法糖，因为你表达同样的事情时要写的代码更少了。</p>

<p>对于一个现有构造函数，你可以利用它的名称和关键字 new 来创建它的一个引用：<code>ClassName::new</code> 。</p>

<h1 id="总结">总结</h1>

<p>对于一个问题，可能会有如下的解决思路：</p>

<ol>
<li>传递代码</li>
<li>使用匿名内部类</li>
<li>使用lambda表达式</li>
<li>使用方法引用</li>
</ol>

<p>以下是你应从本章中学到的关键概念。</p>

<ul>
<li>Lambda 表达式可以理解为一种匿名函数：它没有名称，但有参数列表、函数主体、返回类型，可能还有一个可以抛出的异常的列表。</li>
<li>Lambda 表达式让你可以简洁地传递代码。</li>
<li>函数式接口就是仅仅声明了一个抽象方法的接口。</li>
<li>只有在接受函数式接口的地方才可以使用 Lambda 表达式。</li>
<li>Lambda 表达式允许你直接内联，为函数式接口的抽象方法提供实现，并且将整个表达式作为函数式接口的一个实例。</li>
<li>Java 8 自带一些常用的函数式接口，放在 java.util.function 包里，包括 Predicate<T> 、 Function<T,R> 、 Supplier<T> 、 Consumer<T> 和 BinaryOperator<T></li>
<li>为了避免装箱操作，对 Predicate<T> 和 Function<T, R> 等通用函数式接口的原始类型特化： IntPredicate 、 IntToLongFunction 等。</li>
<li>环绕执行模式（即在方法所必需的代码中间，你需要执行点儿什么操作，比如资源分配和清理）可以配合 Lambda 提高灵活性和可重用性。</li>
<li>Lambda 表达式所需要代表的类型称为目标类型。</li>
<li>方法引用让你重复使用现有的方法实现并直接传递它们。</li>
<li>Comparator 、 Predicate 和 Function 等函数式接口都有几个可以用来结合 Lambda 表达式的默认方法。</li>
</ul>
                        </div>

                        


                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/hugo/post/java/java_8_inaction/ch02/">Ch02 通过行为参数化传递代码</a></li>
        
        <li><a href="/hugo/post/java/java_8_inaction/ch01/">Ch01 为什么要关心Java8</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="https://otswang.gitee.io/hugo/tags/java">java</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
                </div>
            </div>
            <div id="secondary">

    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="https://otswang.gitee.io/hugo/">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/middle_tools/kafka/" title="Kafka">Kafka</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/middle_tools/zk_starter/" title="Zookeeper Starter">Zookeeper Starter</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/java/javafx_starter/" title="Java Fx 入门学习">Java Fx 入门学习</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/codec/" title="常用加密/签名算法">常用加密/签名算法</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/docker/" title="Docker学习">Docker学习</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/webapp/react_starter/" title="React 从入门到入门">React 从入门到入门</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/lang/csharpe_starter/" title="C#语言从入门到入门">C#语言从入门到入门</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/java/java8time/" title="Java checklist">Java checklist</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/keyboard/" title="快捷键记录">快捷键记录</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/vim/" title="vim 使用记录">vim 使用记录</a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/algorithm/">algorithm(4)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/design/">design(7)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/doc/">doc(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/go/">go(3)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java/">java(7)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-java8inaction/">java-java8inaction(11)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-juc/">java-juc(3)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-jvm/">java-jvm(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-spring/">java-spring(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-thinkinginjava/">java-thinkinginjava(11)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/middletools/">middletools(9)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/other/">other(24)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/qt/">qt(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/smallquickappweb/">smallquickappweb(4)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/webapp/">webapp(1)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/%E5%B0%8F%E4%BC%97%E8%AF%AD%E8%A8%80%E4%B8%80%E7%9E%A5/">小众语言一瞥(4)</a>
    </li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
    <a href="https://otswang.gitee.io/hugo/tags/c/">c#</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/checklist/">checklist</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/codec/">codec</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/docker/">docker</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/elk/">elk</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/emmet/">emmet</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/file/">file</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/freemarker/">freemarker</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/git/">git</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/go/">go</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/http/">http</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/interview/">interview</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/java/">java</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/javascript/">javascript</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/juc/">juc</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/jvm/">jvm</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/keyboard/">keyboard</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/linux/">linux</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/lua/">lua</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/manjaro/">manjaro</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/map/">map</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/markdown/">markdown</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mq/">mq</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mybatis/">mybatis</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mycat/">mycat</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mysql/">mysql</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/nginx/">nginx</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/qt/">qt</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/react/">react</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/redis/">redis</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/rust/">rust</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/spring/">spring</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/springboot/">springboot</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/stream/">stream</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/tcp/">tcp</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/thymeleaf/">thymeleaf</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/tree/">tree</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/uml/">uml</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vim/">vim</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vlang/">vlang</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vue/">vue</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/zookeeper/">zookeeper</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E4%BD%8D%E8%BF%90%E7%AE%97/">位运算</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%8D%8F%E8%AE%AE/">协议</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/">多线程</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%B9%B6%E5%8F%91%E9%9B%86%E5%90%88/">并发集合</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/">微信小程序</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%BF%AB%E5%BA%94%E7%94%A8/">快应用</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E6%97%B6%E9%97%B4%E7%B1%BB/">时间类</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E6%A8%A1%E6%9D%BF%E5%BC%95%E6%93%8E/">模板引擎</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%AE%97%E6%B3%95/">算法</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%BC%96%E7%A8%8B/">编程</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/">编程规范</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E8%AE%BE%E8%AE%A1/">设计</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%99%90%E6%B5%81/">限流</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/">面向对象</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%9D%A2%E8%AF%95/">面试</a>
    
</div>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="https://otswang.gitee.io/hugo/index.xml">文章 RSS</a></li>
        </ul>
    </section>

    

</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        &copy; 2020 <a href="https://otswang.gitee.io/hugo/">The Sky of OtsWang By OtsWang</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/Dudiao137/maupassant-hugo" target="_blank">maupassant-ots</a>.
        
    </div>
</footer>


    <script type="text/javascript">
    
    (function(){
        $("pre code").parent().addClass("line-numbers")
    }())

    window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
    };
    </script>
    <script type="text/javascript" src="/hugo/js/prism.js" async="true"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>

<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/hugo/js/totop.js?v=0.0.0" async=""></script>







 
 <script src="https://mermaidjs.github.io/scripts/mermaid.min.js"></script>
 <script>
       mermaid.initialize({ startOnLoad: true });
 </script>
</body>
</html>
